#include "mystdio.h"
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>

static MyFile *BuyFile(int fd,int flag)
{
	MyFile *f = (MyFile*)malloc(sizeof(MyFile));
	if(f == NULL) return NULL;
	f->bufferlen =0;
	f->fileno = fd;
	f->flag= flag;
	f->flush_method = LINE_FLUSH;
	memset(f->outbuffer,0,sizeof(f->outbuffer));
	return f;
}

MyFile *MyFopen(const char *path,const char *mode)
{
	int fd = -1;
	int flag = 0;
	if(strcmp(mode,"w") == 0)
	{
		flag = O_CREAT | O_WRONLY | O_TRUNC;
		fd = open(path,flag,0666);
	}
	else if(strcmp(mode,"a") == 0)
	{
		flag = O_CREAT | O_WRONLY | O_APPEND;
		fd = open(path,flag,0666);
	}
	else if(strcmp(mode,"r") == 0)
	{
		flag = O_RDWR;
		flag = open(path,flag);
	}
	else 
	{
		//TODO
	}
	if(fd < 0) return NULL;
	MyFile *f = BuyFile(fd,flag);
	return f;
}
void MyFclose(MyFile *file)
{
	if(file->fileno < 0) return;
	MyFFlush(file);
	close(file->fileno);
	free(file);
}
int MyFwrite(MyFile *file,const void *str,int len)
{
	//1.拷贝
	memcpy(file->outbuffer+file->bufferlen,str,len);
	file->bufferlen += len;
	//2.尝试判断是否满足刷新条件
	if((file->flush_method & LINE_FLUSH) && (file->outbuffer[file->bufferlen-1] == '\n') )
	{
		MyFFlush(file);
	}
	return 0;
}
void MyFFlush(MyFile *file)
{
	if(file->bufferlen <= 0) return;
	int n =write(file->fileno,file->outbuffer,file->bufferlen);
	(void)n;
	file->bufferlen = 0;
}

